package ar.fiuba.tp7552.buildadmin.service.impl;

import java.util.Collection;

import org.apache.commons.lang.StringUtils;
import org.springframework.transaction.annotation.Transactional;

import ar.fiuba.tp7552.buildadmin.dao.GastoDao;
import ar.fiuba.tp7552.buildadmin.dao.GenericDao;
import ar.fiuba.tp7552.buildadmin.model.BusinessException;
import ar.fiuba.tp7552.buildadmin.model.auth.Role;
import ar.fiuba.tp7552.buildadmin.model.auth.User;
import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.model.gastos.Gasto;
import ar.fiuba.tp7552.buildadmin.model.gastos.GastoCriteria;
import ar.fiuba.tp7552.buildadmin.model.gastos.TipoGasto;
import ar.fiuba.tp7552.buildadmin.service.GastoService;

@Transactional(rollbackFor=BusinessException.class)
public class GastoServiceImpl implements GastoService {

	private GastoDao gastoDao;
	private GenericDao<Edificio, Long> edificioDao;
	private GenericDao<TipoGasto, Long> tgastoDao;
	
	

	public GastoServiceImpl(GastoDao gastoDao,
			GenericDao<Edificio, Long> edificioDao,
			GenericDao<TipoGasto, Long> tgastoDao) {
		super();
		this.gastoDao = gastoDao;
		this.edificioDao = edificioDao;
		this.tgastoDao = tgastoDao;
	}

	@Override
	public Collection<Gasto> getAll() {
		return gastoDao.getAll();
	}

	@Override
	public void create(Gasto gasto, User user) throws BusinessException {
		boolean adminUser = user.hasRole(Role.ROLE_ADMIN);
		if (StringUtils.isNotEmpty(gasto.getFolio()) && adminUser) {
			// para consolidar necesito reemplazar los objetos dummy
			Edificio edif = edificioDao.get(gasto.getEdificio().getId());
			TipoGasto tg = tgastoDao.get(gasto.getTipo().getId());			
			gasto.setEdificio(edif);
			gasto.setTipo(tg);
			gasto.consolidar();
		}
		gastoDao.save(gasto);
	}

	@Override
	public Gasto get(Long gastoId) {
		return gastoDao.get(gastoId);
	}

	@Override
	public void update(Gasto gasto, User user) throws BusinessException {
		boolean adminUser = user.hasRole(Role.ROLE_ADMIN);
		if (StringUtils.isNotEmpty(gasto.getFolio()) && adminUser) {
			// para consolidar necesito reemplazar los objetos dummy
			Edificio edif = edificioDao.get(gasto.getEdificio().getId());
			TipoGasto tg = tgastoDao.get(gasto.getTipo().getId());			
			gasto.setEdificio(edif);
			gasto.setTipo(tg);
			gasto.consolidar();
		}
		gastoDao.update(gasto);
	}

	@Override
	public void delete(Gasto gasto) {
		gastoDao.remove(gasto.getId());
	}
	
	@Override
	public Collection<Gasto> findByCriteria(GastoCriteria criteria) {
		return gastoDao.find(criteria);
	}

}
